home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 14 / CU Amiga Magazine's Super CD-ROM 14 (1997)(EMAP Images)(GB)(Track 1 of 3)[!][issue 1997-09].iso / CUCD / Graphics / WildFire / WildFireFPU / Bonus / draggadget_r0.8 / dragtest.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-06-17  |  6.5 KB  |  173 lines

  1. #include "drag.h"
  2. #include <intuition/gadgetclass.h>
  3. #include <intuition/screens.h>
  4. #include <workbench/workbench.h>
  5.  
  6. #include <clib/alib_stdio_protos.h>
  7. #include <proto/intuition.h>
  8. #include <proto/exec.h>
  9. #include <proto/icon.h>
  10. #include "proto/drag.h"
  11.  
  12. struct IntuitionBase *IntuitionBase;
  13. struct Library *IconBase;
  14. struct ClassLibrary *DragBase;
  15. struct Window *win;
  16.  
  17. ULONG __saveds __asm hookfunc(register __a0 struct Hook *hook,
  18.                               register __a2 struct Gadget *g,
  19.                               register __a1 struct DragInfo *di)
  20. {
  21.   return SetGadgetAttrs(g,win,NULL,GA_Selected,FALSE,NULL);
  22. }
  23.  
  24. struct Hook hook = {NULL,NULL,hookfunc,NULL,NULL};
  25.  
  26. main()
  27. {
  28.   struct Gadget *dg[2];
  29.   struct Screen *scr;
  30.   APTR sc,dw;
  31.   struct MsgPort *dwport;
  32.   struct IntuiMessage *msg;
  33.   struct DropMessage *dmsg;
  34.   struct DiskObject *icon,*icon2;
  35.   struct Image *image,*image2,*image3,*image4;
  36.   BOOL done=FALSE;
  37.  
  38.   if(DragBase=(struct ClassLibrary*)OpenLibrary("gadgets/drag.gadget",40))
  39.   {
  40.     if( (IntuitionBase=(struct IntuitionBase*)OpenLibrary("intuition.library",37)) &&
  41.         (IconBase=OpenLibrary("icon.library",37)) )
  42.     {
  43.       scr=LockPubScreen(NULL);
  44.  
  45.       sc=CreateDContext(scr); /* Create drag context for public screen */
  46.  
  47.       if(win=OpenWindowTags(NULL,WA_Left,100,
  48.                                  WA_Top,100,
  49.                                  WA_Width,200,
  50.                                  WA_Height,200,
  51.                                  WA_Title,(ULONG)"drag&drop-test",
  52.                                  WA_IDCMP,IDCMP_CLOSEWINDOW|IDCMP_GADGETUP|IDCMP_MOUSEBUTTONS,
  53.                                  WA_CloseGadget,TRUE,
  54.                                  WA_DragBar,TRUE,
  55.                                  WA_DepthGadget,TRUE,
  56.                                  WA_GimmeZeroZero,TRUE,
  57.                                  WA_NoCareRefresh,TRUE,NULL))
  58.       {
  59.         if( (icon=GetDiskObject("sys:prefs/locale")) &&
  60.             (icon2=GetDiskObject("sys:prefs/palette")) )
  61.         {
  62.           image=icon->do_Gadget.GadgetRender;
  63.           image2=icon->do_Gadget.SelectRender;
  64.           image3=icon2->do_Gadget.GadgetRender;
  65.           image4=icon2->do_Gadget.SelectRender;
  66.  
  67.           if(dg[0]=NewObject(DragBase->cl_Class,NULL,
  68.                                    GA_Left,20,
  69.                                    GA_Top,20,
  70.                                    GA_ID,0,
  71.                                    DGA_Context,sc,
  72.                                    DGA_DropActHook,&hook,
  73.                                    DGA_ExtSelect,TRUE,
  74.                                    GA_Image,(ULONG)image,
  75.                                    GA_SelectRender,(ULONG)image2,
  76.                                    GA_RelVerify,TRUE,
  77.                                    GA_Highlight,(icon->do_Gadget.Flags) & GFLG_GADGHIGHBITS,
  78.                                    NULL))
  79.           {
  80.             if(dg[1]=NewObject(DragBase->cl_Class,NULL,
  81.                                      GA_Left,20,
  82.                                      GA_Top,70,
  83.                                      GA_ID,1,
  84.                                      GA_Previous,(ULONG)dg[0],
  85.                                      DGA_Context,sc,
  86.                                      DGA_DropActHook,&hook,
  87.                                      DGA_ExtSelect,TRUE,
  88.                                      GA_Image,(ULONG)image3,
  89.                                      GA_SelectRender,(ULONG)image4,
  90.                                      GA_RelVerify,TRUE,
  91.                                      GA_Highlight,(icon2->do_Gadget.Flags) & GFLG_GADGHIGHBITS,
  92.                                      NULL))
  93.             {
  94.               if(dwport=CreateMsgPort())
  95.               {
  96.                 dw=AddDropWindow(sc,1,0,win,dwport);
  97.                 AddGList(win,dg[0],-1,2,NULL);
  98.                 RefreshGList(dg[0],win,NULL,2);
  99.                 while(!done)
  100.                 {
  101.                   Wait((1<<win->UserPort->mp_SigBit)|(1<<dwport->mp_SigBit));
  102.  
  103.                   while(dmsg=(struct DropMessage*)GetMsg(dwport))
  104.                   {
  105.                     struct DragInfo *di=dmsg->dm_DragInfo;
  106.                     WORD woleft=win->LeftEdge + win->BorderLeft;
  107.                     WORD wotop =win->TopEdge + win->BorderTop;
  108.  
  109.                     RemoveGadget(win,dg[di->id]);
  110.                     EraseImage(win->RPort,dg[di->id]->SelectRender,
  111.                                dg[di->id]->LeftEdge,dg[di->id]->TopEdge);
  112.                     SetGadgetAttrs(dg[di->id],win,NULL,
  113.                                     GA_Left,di->mouse.X - woleft - di->offset.X,
  114.                                     GA_Top,di->mouse.Y - wotop - di->offset.Y,
  115.                                     NULL);
  116.                     AddGadget(win,dg[di->id],0);
  117.                     RefreshGadgets(win->FirstGadget,win,NULL);
  118.  
  119.                     ReplyMsg((struct Message*)dmsg);
  120.                   }
  121.  
  122.                   while(msg=(struct IntuiMessage*)GetMsg(win->UserPort))
  123.                   {
  124.                     struct DragInfo *di;
  125.  
  126.                     switch (msg->Class)
  127.                     {
  128.                       case IDCMP_CLOSEWINDOW:
  129.                         done=TRUE;
  130.                         break;
  131.                       case IDCMP_GADGETUP:
  132.                         GetAttr(DGA_DragInfo,msg->IAddress,(ULONG*)&di);
  133.                         if(di->type==DGT_NoObject)
  134.                         {
  135.                           printf("Gadget %d",di->id);
  136.                           printf(" dropped at (%d;%d)\n",di->mouse.X,
  137.                                                          di->mouse.Y);
  138.                         }
  139.                         break;
  140.                       case IDCMP_MOUSEBUTTONS:
  141.                         if(msg->Code==SELECTDOWN)
  142.                         {
  143.                           SetGadgetAttrs(dg[0],win,NULL,GA_Selected,FALSE,NULL);
  144.                           SetGadgetAttrs(dg[1],win,NULL,GA_Selected,FALSE,NULL);
  145.                         }
  146.                     }
  147.                     ReplyMsg((struct Message*)msg);
  148.                   }
  149.                 }
  150.                 RemoveGadget(win,dg[0]);
  151.                 RemoveGadget(win,dg[1]);
  152.                 RemoveDropWindow(dw);
  153.                 DeleteMsgPort(dwport);
  154.               }
  155.               DisposeObject(dg[1]);
  156.             }
  157.             DisposeObject(dg[0]);
  158.           }
  159.           if(icon) FreeDiskObject(icon);
  160.           if(icon2) FreeDiskObject(icon2);
  161.         }
  162.         CloseWindow(win);
  163.       }
  164.       DeleteDContext(sc);
  165.       UnlockPubScreen(NULL,scr);
  166.  
  167.       if(IntuitionBase) CloseLibrary((struct Library*)IntuitionBase);
  168.       if(IconBase) CloseLibrary(IconBase);
  169.     }
  170.     CloseLibrary((struct Library*)DragBase);
  171.   }
  172. }
  173.